home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / iguana / incosrc / incosrc.exe / MIRRBALL / MIRRBALL.ASM < prev    next >
Assembly Source File  |  1993-08-14  |  31KB  |  1,327 lines

  1. ; ------------------------------ MIRRBALL.ASM ---------------------
  2. ; MirrorBall.
  3. ; (C) 1993 bye JCAB.
  4.  
  5. TRACE  = 0
  6.  
  7.         .MODEL SMALL
  8.         .STACK 1400
  9.         .386P
  10.         DOSSEG
  11.         LOCALS
  12.         JUMPS
  13.  
  14. INCLUDE VGASM.INC
  15. INCLUDE VBLIB.INC
  16. INCLUDE VTASM.INC
  17.  
  18.  
  19. SCRW     = 80
  20. BallSize = 48
  21.  
  22. BallInercia = 2
  23. MaxVel      = 4
  24.  
  25.         .DATA
  26.  
  27.         INCLUDE BALL.INC
  28.         INCLUDE BALLGFX.INC
  29.  
  30. LG01 SEGMENT PARA PUBLIC
  31.    LogoBall DB 64000 DUP(0)
  32. ENDS
  33.  
  34.         .CODE
  35.  
  36. EXTRN POINTS : BYTE
  37.  
  38.  
  39. ;===================================================
  40.  
  41.         .CODE
  42.  
  43. A_GDT   label   byte
  44.     NullDes    dw    0, 0, 0, 0
  45.     CodeDes    dw    0ffffh        ; limit (bits 24-31)
  46.         db    0, 0, 0        ; base (bits 0-23)
  47.         db    10011011B    ; present / DPL 0 / code / non conforming / readable
  48.         db    11001111B    ; size 4Gb / 32 bits / limit
  49.         db    0        ; base
  50.     DataDes    dw    0ffffh        ; limit (bits 24-31)
  51.         db    0, 0, 0        ; base (bits 0-23)
  52.         db    10010011B    ; present / DPL 0 / data / writeable
  53.         db    10001111B    ; size 4Gb / 32 bits / limit
  54.         db    0        ; base
  55.  
  56. A_GDT_PTR       dw      17h             ; gdt size
  57.                 dd      0               ; gdt linear base
  58.  
  59. ;===================================================
  60.  
  61.  
  62.         .CODE
  63.         .STARTUP       
  64.         CLD
  65.  
  66.  
  67. ; Protected mode fixup. Some programs like TLink from Borland leave the
  68. ; 386 segment registers unusable. This is to get them back.
  69.  
  70.         SMSW    AX
  71.         TEST    AX,1
  72.         JNZ     @@alreadyPM     ; Do not fix if we are already in PM.
  73.  
  74.         PUSH    CS
  75.         SUB     EAX,EAX
  76.         POP     AX
  77.         SHL     EAX,4
  78.         ADD     EAX,OFFSET A_GDT
  79.         MOV     DWORD PTR CS:[A_GDT_PTR].2,EAX
  80.  
  81.         LGDT    QWORD PTR CS:A_GDT_PTR
  82.  
  83.         SMSW    AX
  84.         OR      AX,1
  85.         LMSW    AX                      ; now running on protected mode
  86.  
  87.         JMP     @@ll1                   ; clear prefetch queue
  88. @@ll1:
  89.  
  90.         MOV     AX,10h                 ; adjust data selectors
  91.         MOV     GS,AX
  92.         MOV     FS,AX
  93.  
  94.         MOV     EAX,CR0
  95.         AND     EAX,0FFFFFFFEh
  96.         MOV     CR0,EAX                ; now running on real mode
  97.  
  98.         JMP     @@ll2                   ; clear prefetch queue
  99. @@ll2:
  100.                        
  101.         XOR     AX,AX
  102.         MOV     FS,AX
  103.         MOV     GS,AX
  104.  
  105. @@alreadyPM:
  106.  
  107. ; End of PM fixup.
  108.  
  109.  
  110.  
  111.  
  112.         CALL    InitMusic
  113.  
  114.         CALL    SetupMirrBallVideo
  115.         CALL    DumpIguanaLogo
  116.  
  117.         CALL    VTDisconnectTimer
  118.  
  119.         MOV     CS:[VBLFullHandler],OFFSET MirrorFullHandler
  120.         XOR     SI,SI
  121.         CALL    InitializeTimerVBL
  122.  
  123.         MOV     BX,0
  124.         MOV     DH,5
  125.         MOV     DL,1
  126.         CALL    VTMiddleSync
  127.  
  128.         CALL    VBLVSync
  129.  
  130.  
  131. MainLoop:
  132.         SetBorder 10, 10, 10
  133.  
  134.         CALL    VBLVSync
  135.  
  136.         MOV     [NFrames],AX
  137.  
  138.         INC     [LoopCounter]
  139.  
  140.         INC     [FrameCounter]
  141.         CMP     [FrameCounter],3
  142.         JC      @@1
  143.          MOV    [FrameCounter],0
  144.    @@1:
  145.  
  146.         CALL    CtrlFadeFondo
  147.  
  148.         SetBorder 63,63,0
  149.  
  150.         MOV     CX,[NFrames]
  151.    @@mlp:
  152.          PUSH   CX
  153.          CALL   MoveBall
  154.          POP    CX
  155.          LOOP   @@mlp
  156.  
  157.         SetBorder 63,0,0
  158.  
  159.         CALL    CallMusic
  160.         CALL    EraseBall
  161.  
  162.         SetBorder 0,0,63
  163.  
  164.         MOV     AX,[BallOffset]
  165.  
  166.         MOV     BX,OFFSET EraseSave1           ; 2 -> 1
  167.         TEST    [FrameCounter],2
  168.         JNZ     SHORT @@scrst
  169.          MOV    BX,OFFSET EraseSave0           ; 1 -> 0
  170.          TEST   [FrameCounter],1
  171.          JNZ    SHORT @@scrst
  172.           MOV   BX,OFFSET EraseSave2           ; 0 -> 2
  173.     @@scrst:       
  174.         MOV     [BX],AX
  175.  
  176.         MOV     AX,SEG LogoBall
  177.         MOV     FS,AX
  178.  
  179.         CALL    CallMusic
  180.         CALL    DrawBallL
  181.  
  182.         SetBorder 0,63,63
  183.  
  184.         CALL    CallMusic
  185.         CALL    DrawBallR
  186.  
  187.         SetBorder 0,63,0
  188.  
  189.         CALL    CallMusic
  190.  
  191. COMMENT #
  192.         MOV     AH,0
  193.         INT     16h
  194.         CMP     AL,27
  195.         JZ      @@Bye
  196.         JMP     MainLoop
  197. #
  198.  
  199.         MOV     BX,6
  200.         MOV     AL,0
  201.         CALL    VTCheckSemaphore
  202.         JNZ     ByeBye
  203.  
  204.         MOV     AH,1
  205.         INT     16h
  206.         JNZ     @@Bye
  207.         JMP     MainLoop
  208.  
  209.    @@Bye:
  210.         XOR     AX,AX
  211.         INT     16h
  212.  
  213. ByeBye:
  214.         CALL    EndTimerVBL
  215.  
  216.         CALL    VTConnectTimer
  217.  
  218.         MOV     DX,3C4h
  219.         MOV     AX,0F02h                ; All planes
  220.         OUT     DX,AX
  221.  
  222.         MOV     DX,3CEh                 ; Bitmask...
  223.         MOV     AX,00008h               ; 00000000b
  224.         OUT     DX,AX
  225.  
  226.         PUSH    DS
  227.         STD
  228.         MOV     DI,SCRW*200*3-1
  229.         MOV     SI,SCRW*200*4-1
  230.         MOV     AX,0A000h
  231.         MOV     ES,AX
  232.         MOV     DS,AX
  233.         MOV     CX,SCRW*200*3
  234.         REP MOVSB
  235.         POP     DS
  236.         CLD
  237.         
  238.         MOV     DX,3CEh                 ; Bitmask...
  239.         MOV     AX,0FF08h               ; 11111111b
  240.         OUT     DX,AX
  241.  
  242. COMMENT #
  243.         CALL    ZeroPalette
  244.         MOV     AX,3
  245.         INT     10h
  246. #
  247.         CALL    RestoreSystemTime
  248.  
  249.         MOV     AX,4C00h
  250.         INT     21h
  251.  
  252.  
  253. ; =======================================
  254.  
  255. MirrorFullHandler:
  256.         PUSH    DS
  257.         PUSH    BX
  258.         PUSHA
  259.  
  260.         MOV     AX,@data
  261.         MOV     DS,AX
  262.  
  263.         CALL    SetDisplayPage
  264.  
  265.         POPA
  266.         POP     BX
  267.         POP     DS
  268.         RET
  269.  
  270.  
  271. ; =======================================
  272.  
  273. SetupMirrBallVideo:
  274.  
  275.         VSync
  276.  
  277.         MOV     BX,SCRW*(216*2 + 16)    ; Value from the BALLS part.
  278.  
  279.         MOV     DX,3D4h                 ; Set the display page.
  280.         MOV     AL,0Ch
  281.         MOV     AH,BH
  282.         OUT     DX,AX
  283.         INC     AL
  284.         MOV     AH,BL
  285.         OUT     DX,AX
  286.  
  287.         VSync
  288.  
  289.         ; Setup the video addressing mode.
  290.  
  291.         MOV     DX,3C0h
  292.         MOV     AL,30h
  293.         OUT     DX,AL
  294.         MOV     AL,01100001b
  295.         OUT     DX,AL 
  296.  
  297.         MOV     DX,3c4h
  298.         MOV     AX,604h                 ; "Unchain my heart". And my VGA...
  299.         OUT     DX,AX
  300.         MOV     AX,0F02h                ; All planes
  301.         OUT     DX,AX
  302.         
  303.         ; Comienzo del modo de Hz reducidos.
  304.  
  305.         MOV     DX,3D4h
  306.         MOV     CX,18h
  307.         MOV     SI,OFFSET CRTCregs
  308.      @@cl1:
  309.          LODSW
  310. ;         OUT    DX,AX
  311.          LOOP   @@cl1
  312.  
  313.         ; Final del modo de Hz reducidos.
  314.  
  315.         MOV     AX,14h                  ; Disable dword mode
  316.         OUT     DX,AX
  317.         MOV     AX,0E317h               ; Enable byte mode.
  318.         OUT     DX,AX
  319.  
  320.         PUSH    DS
  321.  
  322.         MOV     DX,3CEh                 ; Bitmask...
  323.         MOV     AX,00008h               ; 00000000b
  324.         OUT     DX,AX
  325.  
  326.         MOV     SI,SCRW*(216*2 + 16)
  327.         MOV     DI,0
  328.  
  329.         MOV     AX,0A000h
  330.         MOV     ES,AX
  331.         MOV     DS,AX
  332.         XOR     AX,AX
  333.         MOV     CX,SCRW*200
  334.         REP MOVSB
  335.  
  336.         VSync
  337.  
  338.         MOV     DX,3D4h                 ; Set the display page to 0.
  339.         MOV     AL,0Ch
  340.         XOR     AH,AH
  341.         OUT     DX,AX
  342.         INC     AL
  343.         OUT     DX,AX
  344.  
  345.         VSync
  346.  
  347.         XOR     SI,SI
  348.         MOV     CX,SCRW*200*3
  349.         REP MOVSB
  350.  
  351.         MOV     DX,3CEh                 ; Bitmask...
  352.         MOV     AX,0FF08h               ; 11111111b
  353.         OUT     DX,AX
  354.  
  355.         POP     DS
  356.  
  357.         MOV     SI,OFFSET NormalPalette
  358.         MOV     CX,256
  359.         XOR     AL,AL
  360.         CALL    DumpPalette
  361.  
  362.         RET
  363.  
  364.  
  365. SetupMirrBallVideo1:
  366.         CALL    ZeroPalette
  367.         MOV     AX,13h
  368.         INT     10h
  369. ;        CALL    ZeroPalette
  370.  
  371.         VSync
  372.         MOV     DX,3C0h
  373.         MOV     AL,30h
  374.         OUT     DX,AL
  375.         MOV     AL,11100001b
  376.         OUT     DX,AL 
  377.  
  378.         MOV     DX,3c4h
  379.         MOV     AX,604h                 ; "Unchain my heart". And my VGA...
  380.         OUT     DX,AX
  381.         MOV     AX,0F02h                ; All planes
  382.         OUT     DX,AX
  383.         
  384.         ; Comienzo del modo de Hz reducidos.
  385.  
  386.         MOV     DX,3D4h
  387.         MOV     CX,18h
  388.         MOV     SI,OFFSET CRTCregs
  389.      @@cl1:
  390.          LODSW
  391. ;         OUT    DX,AX
  392.          LOOP   @@cl1
  393.  
  394.         ; Final del modo de Hz reducidos.
  395.  
  396.         MOV     AX,14h                  ; Disable dword mode
  397.         OUT     DX,AX
  398.         MOV     AX,0E317h               ; Enable byte mode.
  399.         OUT     DX,AX
  400.  
  401.         XOR     DI,DI                   ; Clear the screen. All planes.
  402.         MOV     AX,0A000h
  403.         MOV     ES,AX
  404.         XOR     AX,AX
  405.         MOV     CX,8000h
  406.         REP STOSW
  407.  
  408.         MOV     SI,OFFSET NormalPalette
  409.         MOV     CX,256
  410.         XOR     AL,AL
  411.         CALL    DumpPalette
  412.  
  413.         RET
  414.  
  415.  
  416. ; =======================================
  417.  
  418. DumpIguanaLogo:
  419.         PUSH    DS
  420.  
  421.         MOV     AX,SEG LogoBall
  422.         MOV     ES,AX
  423.         MOV     FS,AX
  424.  
  425.         MOV     AX,0A000h
  426.         MOV     DS,AX
  427.  
  428.         MOV     DI,OFFSET LogoBall
  429.  
  430.         MOV     BX,4
  431.     @@lp0:
  432.          MOV    DX,3CEh
  433.          MOV    AL,04h                ; One plane at a time.
  434.          MOV    AH,BH
  435.          OUT    DX,AX
  436.  
  437.          XOR    SI,SI
  438.  
  439.          PUSH   DI
  440.  
  441.          MOV    CX,64000/4
  442.     @@lp1:LODSB
  443. ;          MOV   [SI-1],AL
  444.           STOSB
  445.           ADD   DI,3
  446.           LOOP  @@lp1
  447.  
  448.          POP    DI
  449.          INC    DI
  450.          INC    BH
  451.          AND    BH,3
  452.          DEC    BL
  453.          JNZ    @@lp0
  454.  
  455.         POP     DS
  456.         RET
  457.  
  458.  
  459. DumpIguanaLogo1:
  460.         PUSH    DS
  461.  
  462.         MOV     AX,SEG LogoBall
  463.         MOV     DS,AX
  464.         MOV     FS,AX
  465.  
  466.         MOV     AX,0A000h
  467.         MOV     ES,AX
  468.  
  469.         MOV     SI,OFFSET LogoBall
  470.  
  471.         MOV     BX,104h
  472.     @@lp0:
  473.          MOV    DX,3C4h
  474.          MOV    AL,02h                ; One plane at a time.
  475.          MOV    AH,BH
  476.          OUT    DX,AX
  477.  
  478.          XOR    DI,DI
  479.  
  480.          PUSH   SI
  481.  
  482.          MOV    CX,64000/4
  483.     @@lp1:LODSB
  484.           MOV   ES:[DI+SCRW*200*3],AL
  485.           MOV   ES:[DI+SCRW*200*2],AL
  486.           MOV   ES:[DI+SCRW*200*1],AL
  487.           STOSB
  488.           ADD   SI,3
  489.           LOOP  @@lp1
  490.  
  491.          POP    SI
  492.          INC    SI
  493.          SHL    BH,1
  494.          DEC    BL
  495.          JNZ    @@lp0
  496.  
  497.         POP     DS
  498.         RET
  499.  
  500.  
  501. ; =======================================
  502.  
  503. SetDisplayPage:
  504.         MOV     DX,3D4h
  505.  
  506.         MOV     BX,SCRW*200*1           ; 2 -> 1
  507.         TEST    [FrameCounter],2
  508.         JNZ     SHORT @@scrst
  509.          MOV    BX,SCRW*200*0           ; 1 -> 0
  510.          TEST   [FrameCounter],1
  511.          JNZ    SHORT @@scrst
  512.           MOV   BX,SCRW*200*2           ; 0 -> 2
  513.  
  514.     @@scrst:
  515.         MOV     AL,0Ch
  516.         MOV     AH,BH
  517.         OUT     DX,AX
  518.         INC     AL
  519.         MOV     AH,BL
  520.         OUT     DX,AX
  521.         RET
  522.  
  523.  
  524. ; =======================================
  525.  
  526. CtrlFadeFondo:
  527.         MOV     BX,40h
  528.         MOV     AL,0
  529.         CALL    VTCheckSemaphore
  530.         JZ      @@Fin
  531.  
  532.     @@sigue:
  533.         MOV     AX,[FadeCounter]
  534.         INC     [FadeCounter]
  535.         SUB     AX,64
  536.         JC      @@DoFade
  537.  
  538.         JMP     @@Fin
  539.  
  540.     @@DoFade:
  541.         PUSH    AX
  542.  
  543.         MOV     DI,OFFSET NormalPalette+147*3
  544.         MOV     CX,6
  545.         XOR     DL,DL
  546.         CALL    FadeCol
  547.  
  548.         MOV     SI,OFFSET NormalPalette+147*3
  549.         MOV     CX,6
  550.         MOV     AL,147
  551.         CALL    DumpPalette
  552.  
  553.         POP     SI
  554.         ADD     SI,64
  555.  
  556.         ADD     SI,OFFSET LogoBall
  557.         MOV     CX,1000
  558.     @@lp1:
  559.          MOV    AL,FS:[SI]
  560.          CMP    AL,147+6
  561.          JNC    @@c1
  562.           MOV   BYTE PTR FS:[SI],0
  563.     @@c1:ADD    SI,64
  564.          LOOP   @@lp1
  565.  
  566.     @@Fin:
  567.         RET
  568.  
  569.  
  570. ; =======================================
  571.  
  572. GetRandomNumber:
  573.         MOV     AX,[RandSeed]
  574.         MOV     BX,[RandSeed2]
  575.         MOV     BP,[RandSeed3]
  576.         ADD     AX,0a137h
  577.         ADD     BX,63f7h
  578.         ADD     BP,784Ah
  579.         ROL     AX,2
  580.         MOV     [RandSeed],AX
  581.         ADD     BX,AX
  582.         ROR     BX,1
  583.         MOV     [RandSeed2],BX
  584.         SUB     BP,BX
  585.         XOR     AX,BP
  586.         MOV     [RandSeed3],BP
  587.         ADD     AX,BX
  588.         RET
  589.  
  590.  
  591. ; =======================================
  592.  
  593. MoveBall:
  594.         MOV     SI,[PointsPos]
  595.  
  596.         MOV     AL,CS:[SI]
  597.         INC     SI
  598.         CBW
  599.         SHL     AX,6
  600.         ADD     [BallPosX],AX
  601.  
  602.         MOV     AL,CS:[SI]
  603.         INC     SI
  604.         CBW
  605.         SHL     AX,6
  606.         ADD     [BallPosY],AX
  607.  
  608.         MOV     AL,CS:[SI]
  609.         INC     SI
  610.         CBW
  611.         SHL     AX,6
  612.         SUB     [BallPosZ],AX
  613.  
  614.         MOV     [PointsPos],SI
  615.  
  616.         MOV     BX,[BallPosZ]
  617.         ADD     BX,32
  618.         SHR     BX,6
  619.         ADD     BX,BX
  620.         ADD     BX,OFFSET BallSegs
  621.         MOV     BX,[BX]
  622.         MOV     [BallSegment],BX
  623.  
  624.         MOV     AX,SCRW
  625.         MOV     BX,[BallPosY]
  626.         ADD     BX,32
  627.         SHR     BX,6
  628.         MUL     BX
  629.         MOV     BX,[BallPosX]
  630.         ADD     BX,32
  631.         SHR     BX,6
  632.         MOV     CX,BX
  633.         AND     CX,3
  634.         SHR     BX,2
  635.         ADD     AX,BX
  636.         MOV     [BallOffset],AX
  637.         MOV     AL,11h
  638.         SHL     AL,CL
  639.         MOV     [PlaneBit],AL
  640.  
  641.         MOV     AX,[BallPosX]
  642.         ADD     AX,32
  643.         SHR     AX,6
  644.  
  645.         ADD     AX,BallSize/2
  646.         MOV     [MaxDesplXn],AX
  647.         SUB     AX,320
  648.         NEG     AX
  649.         MOV     [MaxDesplXp],AX
  650.  
  651.         MOV     AX,[BallPosY]
  652.         ADD     AX,32
  653.         SHR     AX,6
  654.  
  655.         ADD     AX,BallSize/2
  656.         MOV     DX,320
  657.         MUL     DX
  658.         MOV     [MaxDesplYn],AX
  659.         SUB     AX,200*320
  660.         NEG     AX
  661.         MOV     [MaxDesplYp],AX
  662.  
  663.         RET
  664.  
  665.  
  666. ; =======================================
  667.  
  668. DrawBallL:
  669.         MOV     BX,SCRW*200*1           ; 2 -> 1
  670.         TEST    [FrameCounter],2
  671.         JNZ     SHORT @@scrst
  672.          MOV    BX,SCRW*200*0           ; 1 -> 0
  673.          TEST   [FrameCounter],1
  674.          JNZ    SHORT @@scrst
  675.           MOV   BX,SCRW*200*2           ; 0 -> 2
  676.     @@scrst:
  677.         MOV     AX,0A000h
  678.         MOV     ES,AX
  679.         MOV     BP,0
  680.         MOV     GS,[BallSegment]
  681.         MOV     SI,OFFSET BallGraphic
  682.         MOV     DI,[BallOffset]
  683.         ADD     BX,DI
  684.         XCHG    BX,DI
  685.         SHL     BX,2
  686.         MOV     AL,[PlaneBit]
  687.         SHR     AL,1
  688.  
  689.  
  690.         JNC     SHORT @@p2
  691.          SUB    BX,3
  692.     @@p2:
  693.         SHR     AL,1
  694.         JNC     SHORT @@p3
  695.          SUB    BX,2
  696.     @@p3:
  697.         SHR     AL,1
  698.         JNC     SHORT @@p4
  699.          DEC    BX
  700.     @@p4:
  701.         ADD     BX,3
  702.  
  703.         MOV     CL,4
  704.         MOV     CH,[PlaneBit]
  705.  
  706.     @@lp0:
  707.          PUSH   CX
  708.          PUSH   DI
  709.          PUSH   BX
  710.  
  711.          MOV    DX,3C4h
  712.          MOV    AL,02h                ; One plane at a time.
  713.          MOV    AH,CH
  714.          OUT    DX,AX
  715.  
  716.          MOV    CX,BallSize/4/2
  717.  
  718.     @@lp1:PUSH  CX
  719.           PUSH  DI
  720.           PUSH  BX
  721.                        
  722.           LODSW
  723.           ADD   SI,2
  724.           ADD   DI,AX
  725.           ADD   BX,AX
  726.           ADD   BX,AX
  727.           ADD   BX,AX
  728.           ADD   BX,AX
  729.           LODSW
  730.           MOV   CL,AL
  731.  
  732.     @@lp:
  733.            ; Bucle interior. No reflejante.
  734.  
  735.            MOV  AH,GS:[BP]
  736.  
  737.            INC  BP
  738.            ADD  AH,AH
  739.            SBB  CH,CH     
  740.  
  741.            ADD  AH,AH
  742.            JNC  SHORT @@mirr
  743.  
  744.     @@nomirr:
  745.  
  746.            ; Pixel superior.
  747.  
  748.            MOV  AX,[SI]
  749.            TEST BYTE PTR FS:[BX],CH
  750.            JNZ  SHORT @@c6
  751.            MOV  ES:[DI],AL
  752.  
  753.     @@c6:
  754.            ; Pixel inferior.
  755.  
  756.            MOV  DX,[SI+4]
  757.            SHL  DX,2
  758.            ADD  DX,BX
  759.            XCHG BX,DX
  760.            TEST BYTE PTR FS:[BX],CH
  761.            MOV  BX,DX
  762.            JNZ  SHORT @@c3
  763.            MOV  DX,[SI+4]
  764.            ADD  DI,DX
  765.            MOV  ES:[DI],AH
  766.            SUB  DI,DX
  767.  
  768.            ; Fin del bucle.
  769.  
  770.     @@c3:  ADD  DI,SCRW
  771.            ADD  BX,SCRW*4
  772.            ADD  SI,6
  773.            DEC  CL
  774.            JNZ  SHORT @@lp
  775.     @@c5:
  776.           POP   BX
  777.           POP   DI
  778.           INC   DI
  779.           ADD   BX,4
  780.           POP   CX
  781.           LOOP  SMALL @@lp1
  782.  
  783.          POP    BX
  784.          POP    DI
  785.          POP    CX
  786.  
  787.          INC    BX
  788.  
  789.          ROL    CH,1
  790.          JNC    SHORT @@c1
  791.           INC   DI
  792.     @@c1:
  793.          DEC    CL
  794.          JNZ    SMALL @@lp0
  795.  
  796.         RET
  797.  
  798.  
  799.     @@nopintX:
  800.         ADD     BP,4
  801.         JMP     @@nomirr
  802.  
  803.  
  804.     @@lpm:
  805.            ; Bucle interior. Reflejante.
  806.  
  807.            MOV  AH,GS:[BP]
  808.            INC  BP
  809.            ADD  AH,AH
  810.            SBB  CH,CH     
  811.  
  812.            ADD  AH,AH
  813.            JC   @@nomirr
  814.  
  815.     @@mirr:
  816.  
  817.            MOV  DX,GS:[BP]
  818.            CMP  DX,[MaxDesplXn]
  819.            JNC  @@nopintX
  820.  
  821.            ; Pixel superior.
  822.  
  823.            MOV  AX,[SI]
  824.            TEST BYTE PTR FS:[BX],CH
  825.            JNZ  SHORT @@c7
  826.  
  827.            MOV  DX,BX
  828.            SUB  BX,GS:[BP]
  829.            SUB  BX,GS:[BP+2]
  830.            JC   SHORT @@c8
  831.            MOV  BL,FS:[BX]
  832.            AND  BL,BL
  833.            JZ   @@c8
  834.             MOV AL,BL
  835.     @@c8:
  836.            MOV  BX,DX
  837.  
  838.            MOV  BYTE PTR ES:[DI],AL
  839.  
  840.     @@c7:
  841.            ; Pixel inferior.
  842.  
  843.            MOV  DX,[SI+4]
  844.            SHL  DX,2
  845.            ADD  DX,BX
  846.            XCHG BX,DX
  847.            TEST BYTE PTR FS:[BX],CH
  848.            JNZ  SHORT @@c4
  849.  
  850.            SUB  BX,GS:[BP]
  851.            ADD  BX,GS:[BP+2]
  852.            JC   SHORT @@c9
  853.            MOV  BL,FS:[BX]
  854.            AND  BL,BL
  855.            JZ   @@c9
  856.             MOV AH,BL
  857.     @@c9:
  858.            ADD  DI,[SI+4]
  859.            MOV  ES:[DI],AH
  860.            SUB  DI,[SI+4]
  861.  
  862.            ; Fin del bucle.
  863.  
  864.     @@c4:
  865.            MOV  BX,DX
  866.            ADD  BP,4
  867.            ADD  DI,SCRW
  868.            ADD  BX,SCRW*4
  869.            ADD  SI,6
  870.            DEC  CL
  871.            JNZ  @@lpm
  872.           JMP   @@c5
  873.  
  874.  
  875. ; =======================================
  876.  
  877. DrawBallR:
  878.         MOV     BX,SCRW*200*1           ; 2 -> 1
  879.         TEST    [FrameCounter],2
  880.         JNZ     SHORT @@scrst
  881.          MOV    BX,SCRW*200*0           ; 1 -> 0
  882.          TEST   [FrameCounter],1
  883.          JNZ    SHORT @@scrst
  884.           MOV   BX,SCRW*200*2           ; 0 -> 2
  885.     @@scrst:
  886.         MOV     AX,0A000h
  887.         MOV     ES,AX
  888.         MOV     BP,0
  889.         MOV     GS,[BallSegment]
  890.         MOV     SI,OFFSET BallGraphic
  891.         MOV     DI,[BallOffset]
  892.         ADD     DI,BallSize/4
  893.         ADD     BX,DI
  894.         XCHG    BX,DI
  895.         SHL     BX,2
  896.         MOV     AL,[PlaneBit]
  897.         SHR     AL,1
  898.         JNC     SHORT @@p2
  899.          SUB    BX,3
  900.     @@p2:
  901.         SHR     AL,1
  902.         JNC     SHORT @@p3
  903.          SUB    BX,2
  904.     @@p3:
  905.         SHR     AL,1
  906.         JNC     SHORT @@p4
  907.          DEC    BX
  908.     @@p4:
  909.         ADD     BX,3
  910.  
  911.         MOV     CL,4
  912.         MOV     CH,[PlaneBit]
  913.  
  914.     @@lp0:
  915.          ROR    CH,1
  916.          JNC    SHORT @@c1
  917.           DEC   DI
  918.     @@c1:
  919.          DEC    BX
  920.  
  921.          PUSH   CX
  922.          PUSH   DI
  923.          PUSH   BX
  924.  
  925.          MOV    DX,3C4h
  926.          MOV    AL,02h                ; One plane at a time.
  927.          MOV    AH,CH
  928.          OUT    DX,AX
  929.  
  930.          MOV    CX,BallSize/4/2
  931.  
  932.     @@lp1:PUSH  CX
  933.           PUSH  DI
  934.           PUSH  BX
  935.                        
  936.           LODSW
  937.           ADD   SI,2
  938.           ADD   DI,AX
  939.           ADD   BX,AX
  940.           ADD   BX,AX
  941.           ADD   BX,AX
  942.           ADD   BX,AX
  943.           LODSW
  944.           MOV   CL,AL
  945.  
  946.     @@lp:
  947.            ; Bucle interior. No reflejante.
  948.  
  949.            MOV  AH,GS:[BP]
  950.            INC  BP
  951.            ADD  AH,AH
  952.            SBB  CH,CH     
  953.  
  954.            ADD  AH,AH
  955.            JNC  SHORT @@mirr
  956.  
  957.     @@nomirr:
  958.  
  959.            ; Pixel superior.
  960.  
  961.            MOV  AX,[SI+2]
  962.            TEST BYTE PTR FS:[BX],CH
  963.            JNZ  SHORT @@c6
  964.            MOV  ES:[DI],AL
  965.  
  966.     @@c6:
  967.            ; Pixel inferior.
  968.  
  969.            MOV  DX,[SI+4]
  970.            SHL  DX,2
  971.            ADD  DX,BX
  972.            XCHG BX,DX
  973.            TEST BYTE PTR FS:[BX],CH
  974.            MOV  BX,DX
  975.            JNZ  SHORT @@c3
  976.            MOV  DX,[SI+4]
  977.            ADD  DI,DX
  978.            MOV  ES:[DI],AH
  979.            SUB  DI,DX
  980.  
  981.            ; Fin del bucle.
  982.  
  983.     @@c3:  ADD  DI,SCRW
  984.            ADD  BX,SCRW*4
  985.            ADD  SI,6
  986.            DEC  CL
  987.            JNZ  SHORT @@lp
  988.     @@c5:
  989.           POP   BX
  990.           POP   DI
  991.           DEC   DI
  992.           SUB   BX,4
  993.           POP   CX
  994.           LOOP  SMALL @@lp1
  995.  
  996.          POP    BX
  997.          POP    DI
  998.          POP    CX
  999.  
  1000.          DEC    CL
  1001.          JNZ    SMALL @@lp0
  1002.  
  1003.         RET
  1004.  
  1005.  
  1006.     @@nopintX:
  1007.         ADD     BP,4
  1008.         JMP     @@nomirr
  1009.  
  1010.  
  1011.     @@lpm:
  1012.            ; Bucle interior. Reflejante.
  1013.  
  1014.            MOV  AH,GS:[BP]
  1015.            INC  BP
  1016.            ADD  AH,AH
  1017.            SBB  CH,CH     
  1018.  
  1019.            ADD  AH,AH
  1020.            JC   @@nomirr
  1021.  
  1022.     @@mirr:
  1023.  
  1024.            MOV  DX,GS:[BP]
  1025.            CMP  DX,[MaxDesplXp]
  1026.            JNC  @@nopintX
  1027.  
  1028.            ; Pixel superior.
  1029.  
  1030.            MOV  AX,[SI+2]
  1031.            TEST BYTE PTR FS:[BX],CH
  1032.            JNZ  SHORT @@c7
  1033.  
  1034.            MOV  DX,BX
  1035.            ADD  BX,GS:[BP]
  1036.            SUB  BX,GS:[BP+2]
  1037.            JC   SHORT @@c8
  1038.            MOV  BL,FS:[BX]
  1039.            AND  BL,BL
  1040.            JZ   @@c8
  1041.             MOV AL,BL
  1042.     @@c8:
  1043.            MOV  BX,DX
  1044.  
  1045.            MOV  BYTE PTR ES:[DI],AL
  1046.  
  1047.     @@c7:
  1048.            ; Pixel inferior.
  1049.  
  1050.            MOV  DX,[SI+4]
  1051.            SHL  DX,2
  1052.            ADD  DX,BX
  1053.            XCHG BX,DX
  1054.            TEST BYTE PTR FS:[BX],CH
  1055.            JNZ  SHORT @@c4
  1056.  
  1057.            ADD  BX,GS:[BP]
  1058.            ADD  BX,GS:[BP+2]
  1059.            JC   SHORT @@c9
  1060.            MOV  BL,FS:[BX]
  1061.            AND  BL,BL
  1062.            JZ   @@c9
  1063.             MOV AH,BL
  1064.     @@c9:
  1065.            ADD  DI,[SI+4]
  1066.            MOV  ES:[DI],AH
  1067.            SUB  DI,[SI+4]
  1068.  
  1069.            ; Fin del bucle.
  1070.  
  1071.     @@c4:
  1072.            MOV  BX,DX
  1073.            ADD  BP,4
  1074.            ADD  DI,SCRW
  1075.            ADD  BX,SCRW*4
  1076.            ADD  SI,6
  1077.            DEC  CL
  1078.            JNZ  @@lpm
  1079.           JMP   @@c5
  1080.  
  1081.  
  1082. ; =======================================
  1083.  
  1084. EraseBall:
  1085.         MOV     DI,[EraseSave1]
  1086.         MOV     BP,-SCRW*200*(3-1)           ; 2 -> 1
  1087.         TEST    [FrameCounter],2
  1088.         JNZ     SHORT @@scrst
  1089.          MOV    DI,[EraseSave0]
  1090.          MOV    BP,-SCRW*200*(3-0)           ; 1 -> 0
  1091.          TEST   [FrameCounter],1
  1092.          JNZ    SHORT @@scrst
  1093.           MOV   DI,[EraseSave2]
  1094.           MOV   BP,-SCRW*200*(3-2)           ; 0 -> 2
  1095.     @@scrst:
  1096.  
  1097.         ADD     DI,SCRW*200*3
  1098.  
  1099.         MOV     AX,0A000h
  1100.         MOV     ES,AX
  1101.  
  1102.         MOV     DX,3C4h
  1103.         MOV     AX,0F02h              ; All planes at a time.
  1104.         OUT     DX,AX
  1105.  
  1106.         MOV     DX,3CEh                 ; Bitmask...
  1107.         MOV     AX,00008h               ; 00000000b
  1108.         OUT     DX,AX
  1109.  
  1110.         MOV     SI,OFFSET BallErase
  1111.         MOV     CX,BallSize
  1112.     @@lp0:
  1113.          PUSH   CX
  1114.  
  1115.          LODSW
  1116.          ADD    DI,AX
  1117.          LODSW
  1118.          MOV    CX,AX
  1119.     @@l:
  1120.           REPT 10
  1121.  
  1122.            MOV  AL,ES:[DI]
  1123.            MOV  ES:[DI+BP],AL
  1124.            INC  DI
  1125.            DEC  CX
  1126.            JZ   SHORT @@el
  1127.  
  1128.           ENDM
  1129.  
  1130.           MOV   AL,ES:[DI]
  1131.           MOV   ES:[DI+BP],AL
  1132.           INC   DI
  1133.  
  1134.           LOOP  SHORT @@l
  1135.  
  1136.     @@el:
  1137.          POP    CX
  1138.          LOOP   SHORT @@lp0
  1139.  
  1140.         MOV     DX,3CEh                 ; Bitmask...
  1141.         MOV     AX,0FF08h               ; 11111111b
  1142.         OUT     DX,AX
  1143.  
  1144.         RET
  1145.  
  1146.  
  1147. ; =======================================
  1148. ; =======================================
  1149. ; =======================================
  1150. ; =======================================
  1151. ; =======================================
  1152. ; =======================================
  1153. ; =======================================
  1154. ; =======================================
  1155. ; =======================================
  1156. ; =======================================
  1157.  
  1158.  
  1159.         .DATA
  1160.  
  1161. CRTCregs LABEL BYTE                                               ; Modo 13h
  1162.   DB 11h, 04h       ; End   vertical retrace. (0-0Fh)             ; DB 11h, 8Eh
  1163.   DB 00h, 64h       ; Horizontal total.                           ; DB 00h, 5Fh
  1164.   DB 01h, 4Fh       ; Horizontal display enable end.              ; DB 01h, 4Fh
  1165.   DB 02h, 50h       ; Start horizontal blanking.                  ; DB 02h, 50h
  1166.   DB 03h, 80h+07h   ; End   horizontal blanking. (0-1Fh)          ; DB 03h, 82h
  1167.   DB 04h, 5Bh       ; Start horizontal retrace.                   ; DB 04h, 54h
  1168.   DB 05h, 80h+05h   ; End   horizontal retrace. (0-1Fh)           ; DB 05h, 80h
  1169.   DB 06h,0FFh       ; Vertical total. (+7.0 +7.5)                 ; DB 06h, BFh
  1170.   DB 07h, 00011111b ; Overflow (high bits of vertical registers). ; DB 07h, 1Fh
  1171.   DB 08h, 00h                                                     ; DB 08h, 00h
  1172.   DB 09h, 41h                                                     ; DB 09h, 41h
  1173.   DB 0Ah, 00h                                                     ; DB 0Ah, 00h
  1174.   DB 0Bh, 00h                                                     ; DB 0Bh, 00h
  1175.   DB 0Ch, 00h                                                     ; DB 0Ch, 00h
  1176.   DB 0Dh, 00h                                                     ; DB 0Dh, 00h
  1177.   DB 0Eh, 00h                                                     ; DB 0Eh, 00h
  1178.   DB 0Fh, 00h                                                     ; DB 0Fh, 00h
  1179.   DB 10h,0C0h       ; Start vertical retrace. (+7.2 +7.7)         ; DB 10h, 9Ch
  1180. ;                 
  1181. ;    11h      ────┘ ; End   vertical retrace. (0-0Fh)
  1182.   DB 12h, 8Fh       ; Vertical display enable end. (+7.1 +7.6)    ; DB 12h, 8Fh
  1183.   DB 13h, 28h                                                     ; DB 13h, 28h
  1184.   DB 14h, 40h                                                     ; DB 14h, 40h
  1185.   DB 15h,097h       ; Start vertical blanking. (+7.3 +9.5)        ; DB 15h, 96h
  1186.   DB 16h,0F8h       ; End   vertical blanking.                    ; DB 16h, B9h
  1187.   DB 17h,0A3h                                                     ; DB 17h, A3h
  1188.   DB 18h,0FFh                                                     ; DB 18h, FFh
  1189.  
  1190. ALIGN 2
  1191.  
  1192. FrameCounter DW 0
  1193. RandSeed     DW 348Bh
  1194. RandSeed2    DW 7F34h
  1195. RandSeed3    DW 32bfh
  1196.  
  1197. PlaneBit        DB 11h
  1198.  
  1199. ALIGN 2
  1200.  
  1201. BallOffset      DW 1845
  1202. BallSegment     DW 0
  1203.  
  1204. PointsPos       DW OFFSET POINTS+2
  1205.  
  1206. BallPosX        DW 13 SHL 6
  1207. BallPosY        DW 14 SHL 6
  1208. BallPosZ        DW 47 SHL 6
  1209.  
  1210. BallVelX        DW 0
  1211. BallVelY        DW 0
  1212. BallVelZ        DW 0
  1213.  
  1214. MaxDesplXp      DW 0
  1215. MaxDesplYp      DW 0
  1216. MaxDesplXn      DW 0
  1217. MaxDesplYn      DW 0
  1218.  
  1219. LoopCounter     DW 0
  1220. FadeCounter     DW 0
  1221. NFrames         DW 0
  1222.  
  1223. NormalPalette LABEL BYTE
  1224.  
  1225. ; ----- Normal Palette. ------------
  1226.  
  1227.         DB   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
  1228.         DB   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
  1229.         DB   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
  1230.         DB   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
  1231.         DB  63, 63, 63, 63, 61, 61, 63, 59, 59, 63, 55, 55
  1232.         DB  63, 53, 53, 63, 45, 45, 63, 37, 37, 63, 32, 32
  1233.         DB  63, 26, 26, 63, 24, 24, 63, 20, 20, 61, 16, 16
  1234.         DB  61, 14, 14, 59, 14, 14, 59, 12, 12, 57,  8,  8
  1235.         DB  55,  6,  6, 51,  4,  4, 49,  2,  2, 49,  0,  0
  1236.         DB  51,  0,  0, 53,  0,  0, 55,  0,  0, 57,  0,  0
  1237.         DB  59,  0,  0, 61,  0,  0, 63,  0,  0, 61,  2,  2
  1238.         DB  59,  4,  4, 61,  4,  4, 59,  2,  2, 57,  0,  2
  1239.         DB  55,  0,  2, 53,  0,  2, 51,  0,  2, 51,  2,  2
  1240.         DB  53,  2,  2, 55,  2,  2, 49,  4,  4, 47,  6,  6
  1241.         DB  45,  6,  6, 45,  6,  8, 45,  8,  8, 47,  8,  8
  1242.         DB  49,  8,  8, 49,  6,  6, 47,  4,  4, 45,  2,  4
  1243.         DB  45,  0,  4, 47,  0,  4, 49,  0,  4, 41,  4,  6
  1244.         DB  39,  6,  8, 39,  8,  8, 41, 10, 10, 43, 10, 10
  1245.         DB  45, 10, 10, 47, 10, 10, 49, 10, 10, 45, 12, 12
  1246.         DB  43, 12, 12, 41, 12, 12, 39, 12, 12, 37, 12, 12
  1247.         DB  37, 10, 12, 37, 10, 10, 32,  8, 10, 28,  8, 10
  1248.         DB  26, 10, 12, 26, 12, 14, 24, 10, 14, 22, 10, 14
  1249.         DB  18,  8, 14, 16,  8, 14, 14,  6, 14, 12,  6, 14
  1250.         DB  10,  4, 14,  6,  2, 14,  4,  2, 14,  2,  2, 14
  1251.         DB   2,  0, 14,  4,  0, 14,  6,  0, 12,  8,  0, 12
  1252.         DB  10,  0, 12, 14,  2, 12, 16,  2, 12, 16,  2, 10
  1253.         DB  14,  4, 12, 12,  4, 12, 18,  6, 12, 22,  6, 12
  1254.         DB  24,  4, 10, 26,  2,  8, 26,  0,  8, 24,  0,  8
  1255.         DB  20,  0,  8, 20,  0, 10, 26,  4, 10, 32,  6, 10
  1256.         DB  34,  4,  8, 34,  0,  6, 37,  0,  6, 39,  2,  6
  1257.         DB  39,  4,  6, 30,  2,  8, 30,  0,  8, 30,  0,  6
  1258.         DB  32, 12, 12, 32, 14, 14, 30, 14, 14, 34, 14, 14
  1259.  
  1260.         DB   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
  1261.         DB   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
  1262.         DB   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
  1263.         DB   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
  1264.         DB   0,  0,  0,  0,  0,  0,  0,  0,  0, 31, 22, 33
  1265.         DB  28, 20, 30, 26, 17, 27, 24, 15, 24, 21, 12, 22
  1266.         DB  19, 10, 19,  3,  3,  3,  5,  5,  5,  7,  7,  7
  1267.         DB   9,  9,  9, 10, 10, 10, 12, 12, 12, 14, 14, 14
  1268.         DB  19, 10, 19, 21, 12, 22, 24, 15, 24, 26, 17, 27
  1269.         DB  31, 22, 33, 33, 24, 35, 41, 21, 29, 40, 19, 27
  1270.         DB  39, 17, 25, 38, 15, 23, 31, 10, 31, 33, 11, 33
  1271.         DB  35, 11, 35, 37, 12, 37, 39, 13, 39, 41, 13, 41
  1272.         DB  43, 14, 43, 45, 15, 45, 46, 15, 46, 48, 16, 48
  1273.         DB  50, 17, 50, 52, 17, 52, 54, 18, 54, 56, 19, 56
  1274.         DB  58, 19, 58, 60, 20, 60, 60, 19, 20, 60, 17, 16
  1275.         DB  60, 15, 12, 60, 10,  5, 59,  9,  5, 56,  9,  4
  1276.         DB  52,  8,  4, 49,  7,  4, 45,  7,  3, 41,  6,  3
  1277.         DB  38,  5,  3, 34,  5,  2, 31,  4,  2, 27,  3,  2
  1278.         DB  23,  3,  1, 20,  2,  1, 16,  1,  1, 13,  1,  0
  1279.         DB   9,  0,  0,  0,  5, 10,  0,  5, 12,  0,  5, 13
  1280.         DB   0,  5, 15,  0,  6, 17,  0,  6, 19,  0,  6, 20
  1281.         DB   0,  6, 22,  0,  6, 24,  0,  6, 25,  0,  7, 27
  1282.         DB   0,  7, 29,  0,  7, 31,  0,  7, 32,  0,  7, 34
  1283.         DB   0,  7, 36,  0,  8, 37,  0,  8, 39,  0,  8, 41
  1284.         DB   0,  8, 42,  0,  8, 44,  0,  8, 46,  0,  9, 48
  1285.         DB   0,  9, 49,  0,  9, 51,  0,  9, 53,  0,  9, 54
  1286.         DB   0,  9, 56,  0, 10, 58,  0, 10, 60,  0, 10, 61
  1287.         DB   0, 10, 63,  8, 20, 54, 12, 20, 56, 14, 22, 56
  1288.         DB  16, 24, 57, 18, 27, 57, 21, 29, 57,  0, 31, 63
  1289.         DB  10, 43, 43, 10, 41, 41, 10, 39, 39, 10, 37, 37
  1290.         DB  10, 35, 35, 10, 33, 33, 10, 31, 31, 13, 44,  7
  1291.         DB  15, 47,  7, 16, 50,  8, 17, 53,  9, 40, 22, 13
  1292.  
  1293. ;        DB 768-($-NormalPalette) DUP(0)
  1294.  
  1295. EmptyPalette DB 768 DUP(0)
  1296.  
  1297. ALIGN 2
  1298.  
  1299. ScrOffsets LABEL WORD
  1300.  
  1301.         i = 0
  1302.  
  1303.         REPT 200
  1304.           DW i
  1305.           i = i + SCRW
  1306.         ENDM
  1307.  
  1308.  
  1309. EraseSave0 DW 0
  1310. EraseSave1 DW 30
  1311. EraseSave2 DW 60
  1312.  
  1313.  
  1314. ; INCLUDE IGNLogo.DB
  1315.  
  1316.  
  1317.         .DATA?
  1318.  
  1319. SaveData1       DW ?
  1320.  
  1321.         .DATA
  1322.  
  1323.  
  1324.         END
  1325. ; ------------------------ End of STARF.ASM ---------------------------
  1326.  
  1327.